"""
海龟简介
https://docs.python.org/zh-cn/3.9/library/turtle.html
"""
# 引入海龟包
import turtle
import time # 导入time模块
#turtle.tracer(0) #

# 设置画布: 大小、背景、标题
"""
turtle.title(titleString) #设置屏幕标题,返回None；
turtle.screensize(canvwidth=None, canvheight=None, bg=None)
  # 参数分别为画布的宽(单位像素), 高, 背景颜色
  # bg一种是颜色的英文描述；另一种是十六进制的颜色
  # 可不设置，使用默认值
turtle.setup(width=0.5, height=0.75, startx=None, starty=None)
  # 参数: width, height: 输入宽和高为整数时, 表示像素; 为小数时, 表示占据电脑屏幕的比例
  # (startx, starty): 这一坐标表示矩形窗口左上角顶点的位置, 如果为空,则窗口位于屏幕中心。
  # 可不设置，使用默认值
turtle.bgcolor("black") #设置背景颜色为黑色
"""
turtle.title("练习海龟绘图") # 设置窗口标题
turtle.bgcolor("aqua") # 设置背景色

# 设置画笔（海龟）
tony = turtle.Turtle("turtle") # 海龟对象，在Screen实例上绘图，Screen不存在将自动创建
#print(turtle.getshapes()) # 返回可用海龟形状列表，['arrow', 'blank', 'circle', 'classic', 'square', 'triangle', 'turtle']
print(tony.shape()) # 返回当前海龟的形状名称
tony.shape("arrow") # 改变当前海龟的形状，只改变了tony的形状

print(tony.resizemode()) # 返回：noresize，外观大小不变
tony.resizemode("user") # 改为自定义
tony.shapesize(5,5,8) # 根据拉伸因子和轮廓值调整tony的大小

# 可以类实例方式设置多支画笔（海龟）
# 第二只海龟
tom = turtle.Turtle("circle")
# 多个海龟同时绘图，需要用到多线程方式，多线程共用一个进程

# 设置画笔绘图的颜色和笔尖的粗细
turtle.colormode(255) # 如果要用RGB三原色，需要修改表示颜色数值的最大值为255
tony.fillcolor((255,212,0)) # 设置tony的填充颜色，三原色或颜色英文
  # 如果没有设置colormode，将提示：turtle.TurtleGraphicsError: bad color sequence: (255, 212, 0)
tony.pencolor("red") # 设置tony的轮廓颜色，三原色或颜色英文
tony.pensize(10) # 设置笔尖的粗细

# 控制画笔移动
tony.shape("turtle")
tony.forward(100) # foward前进像素长度、backward后退像素长度、left向左转角度、right向右转角度
tom.backward(100)
tony.left(90)
tony.forward(100)
tony.circle(100) # 画圆、半圆、弧线
tony.penup() # 抬笔不绘图
tony.forward(100)
tony.pendown() # 下笔绘图
tony.right(70)
tony.forward(100)
# 指定坐标移动
tony.goto(-100,-100) # 没有抬笔，移动作画，角度不调整
time.sleep(1) # 暂停1秒
tony.home() # 回到原点，注意海龟指向变为了正东，有角度调整
tony.setx(30) # 横坐标
time.sleep(1) # 暂停2秒
tony.sety(-160) # 纵坐标

# 设置图形填充颜色
tony.begin_fill()
tony.circle(50,180)
tony.end_fill()

# 设置画笔可见还是隐藏
tony.hideturtle() # 隐藏状态依然可以移动作画
tony.backward(200)
time.sleep(3)
tony.showturtle()
tom.backward(200)
# 写字
tom.hideturtle()
tom.write("海龟绘图",move=False,align="center",font=("Arial", 16, "normal"))

"""
# 画笔运动命令
turtle.forward(distance) #向当前画笔方向移动distance像素长度
turtle.backward(distance) #向当前画笔相反方向移动distance像素长度
turtle.right(degree) #顺时针移动degree°
turtle.left(degree) #逆时针移动degree°
turtle.pendown() #移动时绘制图形，缺省时也为绘制
turtle.goto(x,y) #将画笔移动到坐标为x,y的位置
turtle.penup() #提起笔移动，不绘制图形，用于另起一个地方绘制
turtle.circle() #画圆，半径为正(负)，表示圆心在画笔的左边(右边)画圆
turtle.setx( ) #将当前x轴移动到指定位置
turtle.sety( ) #将当前y轴移动到指定位置
turtle.setheading(angle) #设置当前朝向为angle角度
turtle.home() #设置当前画笔位置为原点，朝向东
turtle.dot(r) #绘制一个指定直径和颜色的圆点

# 画笔控制命令
turtle.pencolor(*args) # 返回或设置画笔颜色
turtle.fillcolor(colorstring) #绘制图形的填充颜色
turtle.color(color1, color2) #同时设置pencolor=color1, fillcolor=color2
turtle.filling() #返回当前是否在填充状态
turtle.begin_fill() #准备开始填充图形
turtle.end_fill() #填充完成
turtle.hideturtle() #隐藏画笔的turtle形状
turtle.showturtle() #显示画笔的turtle形状
turtle.shape(name=None)
  # 默认参数返回当前海龟的形状
  # 将name设置为可用的海龟形状名称，从而改变其形状
  # ['arrow', 'blank', 'circle', 'classic', 'square', 'triangle', 'turtle']
turtle.resizemode(rmode=None)
  # rmode -- 字符串 "auto", "user", "noresize" 其中之一
  # 设置大小调整模式为以下值之一: "auto", "user", "noresize"。
  # 如未指定 rmode 则返回当前的大小调整模式。
  # 不同的大小调整模式的效果如下:
    # "auto": 根据画笔粗细值调整海龟的外观。
    # "user": 根据拉伸因子和轮廓宽度 (outline) 值调整海龟的外观，两者是由 shapesize() 设置的。
    # "noresize": 不调整海龟的外观大小。
    # resizemode("user") 会由 shapesize() 带参数使用时被调用。
turtle.shapesize(stretch_wid=None, stretch_len=None, outline=None)
turtle.turtlesize(stretch_wid=None, stretch_len=None, outline=None)
  # stretch_wid -- 正数值; stretch_len -- 正数值; outline -- 正数值
  # 返回或设置画笔的属性 x/y-拉伸因子和/或轮廓。
  # 设置大小调整模式为 "user"。当且仅当大小调整模式设为 "user" 时海龟会基于其拉伸因子调整外观: 
  # stretch_wid 为垂直于其朝向的宽度拉伸因子，stretch_len 为平等于其朝向的长度拉伸因子，outline决定形状轮廓线的粗细。
turtle.write(arg, move=False, align="left", font=("Arial", 8, "normal"))
  参数：
      arg -- 要书写到 TurtleScreen 的对象
      move -- True/False。如果move为真值，画笔至文本的右下角。
      align -- 字符串 "left", "center" 或 "right"
      font -- 一个三元组 (fontname, fontsize, fonttype)
  使用给定的字体将文本（arg）写到当前海龟位置。

# 全局控制命令
turtle.clear() #清空turtle窗口,但是turtle的位置和状态不会改变
turtle.reset() #清空窗口,重置turtle状态为起始状态
turtle.undo() #撤销上一个turtle动作
turtle.isvisible() #返回当前turtle是否可见
turtle.stamp() 
  #在海龟当前位置印制一个海龟形状。返回该印章的 stamp_id
  # 印章可以通过调用 clearstamp(stamp_id) 来删除。
turtle.clearstamp(stampid)
  #功能: 用于删除所有或全部前n个印章。此方法需要一个整数参数。因此,带有id的印章将被清除。
  #参数: stampid-整数,必须为先前的stamp()调用的返回值。
turtle.clearstamps(n=None)
  #参数: n -- 一个整型数 (或 None)
  #删除全部或前/后 n 个海龟印章。
  # 如果 n 为 None 则删除全部印章，如果 n > 0 则删除前 n 个印章，否则如果 n < 0 则删除后 n 个印章。
turtle.write(s [,font=("font-name",font_size,"font_type")])
  # 写文本,s为文本内容,font是字体的参数,分别为字体名称,大小和类型;font为可选项,font参数也是可选项
turtle.getshapes() # 返回当前可用海龟形状的列表
turtle.tracer(n=None, delay=None)
  # n -- 非负整型数;delay -- 非负整型数
  # 启用/禁用海龟动画并设置刷新图形的延迟时间。
  # 如果指定 n 值，则只有每第 n 次屏幕刷新会实际执行。(可被用来加速复杂图形的绘制。) 
  # 如果调用时不带参数，则返回当前保存的 n 值。
  # 第二个参数设置延迟值。约等于连续两次画布刷新的间隔时间。绘图延迟越长，动画速度越慢
turtle.colormode(cmode=None)
  # cmode必须是1.0或255其中之一
  # 默认参数将返回颜色模式
  # 将其设为 1.0 或 255。构成颜色三元组的 r, g, b 数值必须在 [0, cmode] 范围之内
turtle.done() # 开始事件循环，必须作为一个海龟绘图程序的结束语句，表示绘制完成后等待进一步指令，否则窗口自动关闭
"""

# 清除之前的图形
tony.reset()
tom.reset()
tom.hideturtle()

# 示例：绘制太阳花
tony.speed(0)
#tom.speed(0)
tony.color("red", "yellow")
tony.pensize(1)
tony.begin_fill()
for i in range(60): # 
  tony.forward(200)
  tony.left(171)
tony.end_fill()

# 绘制几何图形
tom.penup()
tom.backward(200)
tom.pendown()
color_ = ["red", "blue", "green", "black"]

# for i in range(50):
#   tom.pencolor(color_[i%4])
#   for j in range(4):
#     tom.forward(50+5*i)
#     tom.left(90)
#   tom.left(2)

#while循环
j = 0 
while True:
    if j < 50:
        tom.pencolor(color_[j%4])
        n = 0
        while True:
            if n < 4:
                tom.forward(50+5*j)
                tom.left(90)
                n += 1
            else:
                break
        tom.left(2)
        j += 1
    else:
        break

tonyPos = tony.pos()
print(tonyPos)
print(abs(tony.pos()))
print(type(tonyPos))
turtle.done() # 放最后
